var crypto = require('crypto');

export default {
    /**
     * 日期格式化
     * @param date
     * @param fmt yyyy-MM-dd hh:mm:ss.SSS week
     * @param offset：加减天数
     * @returns {*}
     */
    formatDate(date, fmt, offset) {
        try {
            let d = new Date(date);
            if (d && d.toString() === "Invalid Date") {
                return d;
            }
            if (offset) {
                if (offset.day) {
                    d.setDate(d.getDate() + offset.day);
                }
                if (offset.month) {
                    d.setMonth(d.getMonth() + offset.month, 1);
                }
                if (offset.year) {
                    d.setFullYear(d.getFullYear() + offset.year);
                }
            }
            let _date = {
                "M+": d.getMonth() + 1, // 月份
                "d+": d.getDate(), // 日
                "h+": d.getHours(), // 小时
                "m+": d.getMinutes(), // 分
                "s+": d.getSeconds(), // 秒
                "q+": Math.floor((d.getMonth() + 3) / 3), // 季度
                "S": d.getMilliseconds()
            };
            if (/(y+)/.test(fmt)) {
                fmt = fmt.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));
            }
            for (let _d in _date) {
                if (new RegExp("(" + _d + ")").test(fmt)) {
                    fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (_date[_d]) : (("00" + _date[_d]).substr(("" + _date[_d]).length)));
                }
            }
            if (/(week)/.test(fmt)) {
                const weeks = ["日", "一", "二", "三", "四", "五", "六"];
                fmt = fmt.replace(RegExp.$1, "星期" + weeks[d.getDay()]);
            }
            return fmt;
        } catch (err) {
            console.error(err);
        }
        return date;
    },
    /**
     * 货币格式化
     * 将数值四舍五入(保留2位小数)后格式化成金额形式
     *
     * @param num 数值(Number或者String)
     * @param digit 保留小数点几位
     * @return 金额格式的字符串,如'1,234,567.45'
     * @type String
     */
    formatCurrency(num, digit) {
        num = num.toString().replace(/\$|\,/g, '');
        if (isNaN(num)) {
            num = "0";
        }
        if (typeof(digit) != "number" || digit < 0) {
            digit = 0;
        }
        //最大支持11位小数
        if (digit > 11) {
            return;
        }
        // 绝对值
        var sign = (num == (num = Math.abs(num))), cents = null;
        num = Math.floor(num * Math.pow(10, digit) + 0.50000000001);
        if (digit > 0) {
            //小数位
            cents = num % Math.pow(10, digit);
            cents = ("00000000000" + num).substr(-digit)
        }
        num = Math.floor(num / Math.pow(10, digit)).toString();
        for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
            num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
        }
        if (cents) {
            return (((sign) ? '' : '-') + num + '.' + cents);
        } else {
            return (((sign) ? '' : '-') + num);
        }
    },
    /**
     * 解析URL
     * @param url
     * @returns {{protocol, host, port, query, params, file: *, hash, path: string, relative: string, segments: Array}}
     */
    parseUrl(url) {
        if (!url) {
            return;
        }
        var _a_el = document.createElement("a");
        _a_el.href = url;
        return {
            protocol: _a_el.protocol.replace(':', ''), //协议
            host: _a_el.hostname, //域名
            port: _a_el.port,
            query: (function () {
                if (_a_el.search) {
                    return _a_el.search;
                }
                //兼容http://xxxx/#/id=xxx这种格式
                if (url.indexOf("?") != -1) {
                    return url.substring(url.indexOf("?"));
                }
                return "";
            })(),
            params: (function () {
                var ret = {},
                    seg = _a_el.search;
                //兼容http://xxxx/#/id=xxx这种格式
                if (!seg && url.indexOf("?") != -1) {
                    seg = url.substring(url.indexOf("?"));
                }
                seg = seg.replace(/^\?/, '').split('&');
                var len = seg.length,
                    i = 0,
                    s;
                for (; i < len; i++) {
                    if (!seg[i]) {
                        continue;
                    }
                    s = seg[i].split('=');
                    ret[s[0]] = s[1];
                }
                return ret;
            })(), //参数对象
            file: (_a_el.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
            hash: _a_el.hash.replace('#', ''),
            path: _a_el.pathname.replace(/^([^\/])/, '/$1'),
            relative: (_a_el.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
            segments: _a_el.pathname.replace(/^\//, '').split('/')
        }
    },
    /**
     * 本地LocalStorage存储
     * @param key
     * @param value
     */
    localStorage(key, value) {
        if (arguments.length === 0) {
            app.logger.warn("没有参数");
            return;
        }
        if (!window || !window.localStorage) {
            app.logger.error("您开启了秘密浏览或无痕浏览模式，请关闭!");
            return;
        }
        if (arguments.length === 1 || typeof(value) === "undefined") {
            return window.localStorage.getItem(key);
        } else if (value === null || value === '') {
            window.localStorage.removeItem(key);
        } else if (typeof(value) === "object") {
            window.localStorage.setItem(key, JSON.stringify(value));
        } else {
            window.localStorage.setItem(key, value);
        }
    },
    /**
     * 本地SessionStorage存储
     * @param key
     * @param value
     */
    sessionStorage(key, value) {
        if (arguments.length === 0) {
            app.logger.warn("没有参数");
            return;
        }
        if (!window || !window.sessionStorage) {
            app.logger.error("您开启了秘密浏览或无痕浏览模式，请关闭!");
            return;
        }
        if (arguments.length === 1 || typeof(value) === "undefined") {
            return window.sessionStorage.getItem(key);
        } else if (value === null || value === '') {
            window.sessionStorage.removeItem(key);
        } else if (typeof(value) === "object") {
            window.sessionStorage.setItem(key, JSON.stringify(value));
        } else {
            window.sessionStorage.setItem(key, value);
        }
    },
    /**
     * MD5加密
     * @param data
     * @param salt
     * @returns {*}
     */
    md5(data, salt) {
        if (!salt) {
            salt = app.config.setting.salt;
        }
        let md5 = crypto.createHash('md5');
        return md5.update(data + salt).digest('hex');
    },
    /**
     * 验证
     * @param type
     * @param value
     * @returns {boolean}
     */
    validate(type, value) {
        let pattern;
        switch (type) {
            case "ip":
                // 一个IP字串，由四段组成，每一段是0～255的数字，段与段之间用小数点隔开
                // 0～9 \d 单个数字
                // 10～99 [1-9]\d 两位数
                // 100～199 1\d\d 百位为1的三位数
                // 200～249 2[0-4]\d 三位数，百位是2，十位是0～9
                // 250～255 25[0-5] 三位数，百位是2，十位是5，个位是0～5
                pattern = /^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])$/;
                return pattern.test(value);
            case "domain":
                // 一个完整的域名，由根域、顶级域、二级、三级……域名构成，每级域名之间用点分开，每级域名由字母、数字和减号构成（第一个字母不能是减号），不区分大小写，长度不超过63
                // 单独的名字可以由正则表达式[a-zA-Z0-9][-a-zA-Z0-9]{0,62}来匹配，而完整的域名至少包括两个名字（比如google.com，由google和com构成），最后可以有一个表示根域的点（在规范中，最后有一个点的才是完整域名，但一般认为包括两个以上名字的域名也是完整域名，哪怕它后面没有点）
                pattern = /^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?$/;
                return pattern.test(value);
            case "serverPort1":
                pattern = /^([1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
                return pattern.test(value);
            case "terminalNo":
                pattern = /^[\s\S]{0,16}$/;
                return pattern.test(value);
            case 'telephone':
                pattern = /^[1][3,4,5,7,8][0-9]{9}$/;
                return pattern.test(value);
            case 'password':
                pattern = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?![,\.#%'\+\*\-:;^_`]+$)[,\.#%'\+\*\-:;^_`0-9A-Za-z]{6,20}$/;
                return pattern.test(value);
        }
        return false;
    },
    /**
     * 校验 IP地址、网关是否在同一个网段
     * @param ip
     * @param gateway
     * @param mask
     * @returns {boolean}
     */
    checkIpMask(ip, gateway, mask) {
        let ips = ip.split('.');
        let gateways = gateway.split('.');
        let masks = mask.split('.');
        for (let i = 0, len = masks.length; i < len; i++) {
            let _mask = masks[i];
            if (_mask === "255") {
                if ((parseInt(ips[i]) & 255) !== parseInt(gateways[i])) {
                    return false;
                }
            }
        }
        return true;
    },
    /**
     * 是否移动端访问
     * @return {boolean}
     */
    mobile() {
        const userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
        if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(userAgent)) {
            return true;
        }
        return false;
    },
    // 账单价格
    money(money) {
        let final = {};
        if (money === 0) {
            return final
        }
        let format = money.toString();
        if (format.indexOf('-') > -1) {
            format = format.substr(1)
        }
        if (format.indexOf('.') === -1) {
            format = format + '.00'
        }
        let classify = format.split('.');
        let length = classify[0].length;
        final.unitary = classify[0].charAt(length - 1);//元
        final.tens = classify[0].charAt(length - 2);//十
        final.hundreds = classify[0].charAt(length - 3);//百
        final.thousands = classify[0].charAt(length - 4);//千
        final.tensOfThousands = classify[0].charAt(length - 5);//万
        final.dime = classify[1].charAt(0);//角
        final.penny = classify[1].charAt(1);//分

        return final;
    },
    //表单验证：
    /*
    * type 格式 number string(数字和字母) tel float
    * num 长度
    */
    validateForm(type, num) {
        if (type == 'string') {
            if (num) {
                return new RegExp("^[0-9a-zA-Z]{" + num + "}$");
            } else {
                return /^[0-9a-zA-Z]*$/
            }
        } else if (type == 'tel') {
            return /^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$/;
        } else if (type == 'number') { //数字类型
            if (num) {
                return new RegExp("^[0-9]{" + num + "}$");
            } else {
                return /^[0-9]*$/
            }
        } else if (type == 'float') {
            if (num) {
                return new RegExp("^(([1-9][0-9]*)|(([0]\.\d{" + num + "}|[1-9][0-9]*\.\d{1,2})))$");
            } else {
                return /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/;
            }
        } else if (type == 'any') {
            return /^[^ ]+$/
        } else if (type == 'user') {
            return /^[a-zA-Z0-9_-]{2,16}$/
        } else if (type == 'password') {
            return /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?![,\.#%'\+\*\-:;^_`]+$)[,\.#%'\+\*\-:;^_`0-9A-Za-z]{6,20}$/
        } else if (type === 'floatZero') {
            return /^(([1-9][0-9]*)|(([0]|[0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/;
        }
    },
    //查询前五年
    getFiveYears(date) {
        let yearRange = [];
        let n = new Date(date);
        let y = n.getFullYear();
        let m = n.getMonth() + 1;
        let d = n.getDay();
        if (n && n.toString() === "Invalid Date") {
            throw new Error('日期格式错误');
        } else if (m >= 9) {
            if (m === 9) {
                if (d >= 30) {
                    for (let i = 1; i < 6; i++) {
                        yearRange.push((y + 1 - i) + '-' + (y + 1 - i + 1))
                    }
                } else {
                    for (let j = 1; j < 6; j++) {
                        yearRange.push((y - j) + '-' + (y - (j - 1)))
                    }
                }
            } else {
                for (let i = 1; i < 6; i++) {
                    yearRange.push((y + 1 - i) + '-' + (y + 1 - i + 1))
                }
            }
        } else {
            for (let j = 1; j < 6; j++) {
                yearRange.push((y - j) + '-' + (y - (j - 1)))
            }
        }
        return yearRange;
    },
    /**
     * 前缀补零
     * @param num
     * @param n
     * @return {string}
     */
    prefixZero(num, n) {
        if (num.length >= n) {
            return num;
        }
        return (Array(n).join('0') + num).slice(-n);
    },
    /**
     * 升级wgt文件
     * @param wgtUrl
     */
    upgradeWgt(wgtUrl) {
        if (!window.plus) {
            return;
        }
        window.plus.nativeUI.showWaiting("升级文件下载中...");
        window.plus.downloader.createDownload(app.config.setting.serverAsset + wgtUrl, {filename: "_doc/update/"},
            function (d, status) {
                if (status === 200) {
                    console.log("下载wgt成功：" + d.filename);
                    installWgt(d.filename); // 安装wgt包
                } else {
                    console.log("下载wgt失败！");
                    window.plus.nativeUI.alert("升级文件下载失败，请稍后重试！");
                }
                window.plus.nativeUI.closeWaiting();
            }).start();
    }
};

/**
 * 更新应用资源
 * @param path
 */
function installWgt(path) {
    if (!window.plus) {
        return;
    }
    window.plus.nativeUI.showWaiting("升级文件安装...");
    window.plus.runtime.install(path, {}, function () {
        window.plus.nativeUI.closeWaiting();

        window.plus.nativeUI.alert("升级完成！", function () {
            window.plus.runtime.restart();
        });
    }, function (e) {
        window.plus.nativeUI.closeWaiting();
        console.log("安装wgt文件失败[" + e.code + "]：" + e.message);
        window.plus.nativeUI.alert("升级文件安装失败[" + e.code + "]：" + e.message);
    });
}
